{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Бушуева Вячеслава Владимировича\n",
      "Бушуеву Веру Константиновну\n"
     ]
    }
   ],
   "source": [
    "from yargy import rule, or_, Parser\n",
    "from yargy.predicates import gram\n",
    "\n",
    "FIRST = gram('Name')\n",
    "LAST = gram('Surn')\n",
    "MIDDLE = gram('Patr')\n",
    "ABBR = gram('Abbr')\n",
    "\n",
    "NAME = or_(\n",
    "    rule(FIRST),\n",
    "    rule(LAST),\n",
    "    rule(FIRST, LAST),\n",
    "    rule(LAST, FIRST),\n",
    "    rule(FIRST, MIDDLE, LAST),\n",
    "    rule(LAST, FIRST, MIDDLE),\n",
    "    rule(ABBR, '.', ABBR, '.', LAST),\n",
    "    rule(LAST, ABBR, '.', ABBR, '.'),\n",
    ")\n",
    "\n",
    "parser = Parser(NAME)\n",
    "text = '''\n",
    "Хочу поблагодарить учителей моего, теперь уже бывшего, одиннадцатиклассника:\n",
    "Бушуева Вячеслава Владимировича и Бушуеву Веру Константиновну. \n",
    "'''\n",
    "for match in parser.findall(text):\n",
    "    start, stop = match.span\n",
    "    print(text[start:stop])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Name(first='вячеслав', middle='владимирович', last='бушуев')\n",
      "Name(first='вера', middle='константиновна', last='бушуев')\n"
     ]
    }
   ],
   "source": [
    "from yargy.interpretation import fact\n",
    "\n",
    "Name = fact(\n",
    "    'Name',\n",
    "    ['first', 'middle', 'last']\n",
    ")\n",
    "\n",
    "FIRST = gram('Name').interpretation(\n",
    "    Name.first.inflected()\n",
    ")\n",
    "LAST = gram('Surn').interpretation(\n",
    "    Name.last.inflected()\n",
    ")\n",
    "MIDDLE = gram('Patr').interpretation(\n",
    "    Name.middle.inflected()\n",
    ")\n",
    "ABBR = gram('Abbr')\n",
    "FIRST_ABBR = ABBR.interpretation(\n",
    "    Name.first.custom(str.lower)\n",
    ")\n",
    "MIDDLE_ABBR = ABBR.interpretation(\n",
    "    Name.middle.custom(str.lower)\n",
    ")\n",
    "\n",
    "NAME = or_(\n",
    "    rule(FIRST),\n",
    "    rule(LAST),\n",
    "    rule(FIRST, LAST),\n",
    "    rule(FIRST_ABBR, '.', MIDDLE_ABBR, '.', LAST),\n",
    "    rule(LAST, FIRST, MIDDLE),\n",
    "    rule(FIRST, LAST, MIDDLE)\n",
    ").interpretation(\n",
    "    Name\n",
    ")\n",
    "    \n",
    "parser = Parser(NAME)\n",
    "text = '''\n",
    "Хочу поблагодарить учителей моего, теперь уже бывшего, одиннадцатиклассника:\n",
    "Бушуева Вячеслава Владимировича и Бушуеву Веру Константиновну. \n",
    "'''\n",
    "for match in parser.findall(text):\n",
    "    print(match.fact)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Name(first='вячеслав', middle='владимирович', last='бушуев')\n",
      "Name(first='вера', middle='константиновна', last='бушуева')\n"
     ]
    }
   ],
   "source": [
    "from yargy.relations import gnc_relation\n",
    "\n",
    "gnc = gnc_relation()\n",
    "\n",
    "FIRST = gram('Name').interpretation(\n",
    "    Name.first.inflected()\n",
    ").match(gnc)\n",
    "\n",
    "LAST = gram('Surn').interpretation(\n",
    "    Name.last.inflected()\n",
    ").match(gnc)\n",
    "\n",
    "MIDDLE = gram('Patr').interpretation(\n",
    "    Name.middle.inflected()\n",
    ").match(gnc)\n",
    "\n",
    "ABBR = gram('Abbr')\n",
    "FIRST_ABBR = ABBR.interpretation(\n",
    "    Name.first.custom(str.lower)\n",
    ")\n",
    "MIDDLE_ABBR = ABBR.interpretation(\n",
    "    Name.middle.custom(str.lower)\n",
    ")\n",
    "\n",
    "NAME = or_(\n",
    "    rule(FIRST),\n",
    "    rule(LAST),\n",
    "    rule(FIRST, LAST),\n",
    "    rule(FIRST_ABBR, '.', MIDDLE_ABBR, '.', LAST),\n",
    "    rule(LAST, FIRST, MIDDLE),\n",
    "    rule(FIRST, LAST, MIDDLE)\n",
    ").interpretation(\n",
    "    Name\n",
    ")\n",
    "    \n",
    "parser = Parser(NAME)\n",
    "text = '''\n",
    "Хочу поблагодарить учителей моего, теперь уже бывшего, одиннадцатиклассника:\n",
    "Бушуева Вячеслава Владимировича и Бушуеву Веру Константиновну. \n",
    "'''\n",
    "for match in parser.findall(text):\n",
    "    print(match.fact)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Name(first='вячеслав', middle='владимирович', last='бушуев', nick=None)\n",
      "Name(first='вера', middle='константиновна', last='бушуева', nick=None)\n"
     ]
    }
   ],
   "source": [
    "from natasha import NamesExtractor\n",
    "\n",
    "extractor = NamesExtractor()\n",
    "\n",
    "for match in extractor(text):\n",
    "    print(match.fact)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Байкеры мотоклуба «Ночные волки» совместно с главой Чечни [[Рамзаном Кадыровым]]\n",
      "совершили мотопробег, посвященный дню рождения президента РФ [[Владимира Путина]].\n",
      "Об этом сообщил в «ВКонтакте» сам [[Кадыров]]. «В среду вечером мы организовали\n",
      "мотопробег, посвященный дню рождения президента России [[Владимира Путина]].\n",
      "\n",
      "В США в возрасте 92 лет скончалась негритянка [[Роза]] [[Паркс]], ставшая символом\n",
      "правозашитного движения в США, сообщает Reuters.\n",
      "\n",
      "В составе \"Эдмонтона\" голы забили [[Райан Джонс]], Том [[Гилберт]], а также\n",
      "[[Райан Смит]], который поразил пустые ворота.\n",
      "\n",
      "Следом за Свифт идут [[Кэти]] [[Перри]] (219 миллионов), Селена [[Гомес]]\n",
      "(205 миллионов) и [[Рианна]] (190 миллионов)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from natasha.markup import show_markup\n",
    "\n",
    "text = '''\n",
    "Байкеры мотоклуба «Ночные волки» совместно с главой Чечни Рамзаном Кадыровым\n",
    "совершили мотопробег, посвященный дню рождения президента РФ Владимира Путина.\n",
    "Об этом сообщил в «ВКонтакте» сам Кадыров. «В среду вечером мы организовали\n",
    "мотопробег, посвященный дню рождения президента России Владимира Путина.\n",
    "\n",
    "В США в возрасте 92 лет скончалась негритянка Роза Паркс, ставшая символом\n",
    "правозашитного движения в США, сообщает Reuters.\n",
    "\n",
    "В составе \"Эдмонтона\" голы забили Райан Джонс, Том Гилберт, а также\n",
    "Райан Смит, который поразил пустые ворота.\n",
    "\n",
    "Следом за Свифт идут Кэти Перри (219 миллионов), Селена Гомес\n",
    "(205 миллионов) и Рианна (190 миллионов)\n",
    "'''\n",
    "\n",
    "matches = extractor(text)\n",
    "spans = [_.span for _ in matches]\n",
    "show_markup(text, spans)\n",
    "# for match in matches:\n",
    "#     display(match.fact)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>\n",
       "\n",
       ".markup {\n",
       "    white-space: pre-wrap;\n",
       "}\n",
       "\n",
       ".markup > mark {\n",
       "    line-height: 1;\n",
       "    display: inline-block;\n",
       "    border-radius: 0.25em;\n",
       "    border: 1px solid #fdf07c;\n",
       "    background: #ffffc2;\n",
       "}\n",
       "    </style><div class=\"markup tex2jax_ignore\">\n",
       "353691, Ейск г, <mark>Коммунистическая ул, д.85/6, оф. 10</mark> , («Ейск Коммунистическая_2349_С\n",
       "\n",
       "типография: <mark>г.Люберцы, ул. Инициативная, д.5</mark>\n",
       "\n",
       "601440, г. Вязники, Владимирская область, микрорайон Дечинский, д. 11.\n",
       "</div>"
      ],
      "text/plain": [
       "Matches('\\n353691, Ейск г, Коммунистическая ул, д.85/6, оф. 10 , («Ейск Коммунистическая_2349_С\\n\\nтипография: г.Люберцы, ул. Инициативная, д.5\\n\\n601440, г. Вязники, Владимирская область, микрорайон Дечинский, д. 11.\\n',\n",
       "        [Match([MorphTagToken('Коммунистическая',\n",
       "                              [17, 33),\n",
       "                              'RU',\n",
       "                              'I',\n",
       "                              [Form('коммунистический',\n",
       "                                    Grams(ADJF,femn,nomn,sing))]),\n",
       "                MorphTagToken('ул',\n",
       "                              [34, 36),\n",
       "                              'RU',\n",
       "                              'O',\n",
       "                              [Form('ул', Grams(UNKN))]),\n",
       "                TagToken(',', [36, 37), 'PUNCT', 'O'),\n",
       "                MorphTagToken('д',\n",
       "                              [38, 39),\n",
       "                              'RU',\n",
       "                              'O',\n",
       "                              [Form('далее', Grams(ADVB,Abbr))]),\n",
       "                TagToken('.', [39, 40), 'PUNCT', 'O'),\n",
       "                TagToken('85', [40, 42), 'INT', 'O'),\n",
       "                TagToken('/', [42, 43), 'PUNCT', 'O'),\n",
       "                TagToken('6', [43, 44), 'INT', 'O'),\n",
       "                TagToken(',', [44, 45), 'PUNCT', 'O'),\n",
       "                MorphTagToken('оф',\n",
       "                              [46, 48),\n",
       "                              'RU',\n",
       "                              'O',\n",
       "                              [Form('оф', Grams(UNKN))]),\n",
       "                TagToken('.', [48, 49), 'PUNCT', 'O'),\n",
       "                TagToken('10', [50, 52), 'INT', 'O')],\n",
       "               [17, 52)),\n",
       "         Match([MorphTagToken('г',\n",
       "                              [99, 100),\n",
       "                              'RU',\n",
       "                              'O',\n",
       "                              [Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,inan,masc,nomn,sing)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,gent,inan,masc,sing)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,datv,inan,masc,sing)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,accs,inan,masc,sing)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,ablt,inan,masc,sing)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,inan,loct,masc,sing)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,inan,masc,nomn,plur)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,gent,inan,masc,plur)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,datv,inan,masc,plur)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,accs,inan,masc,plur)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,ablt,inan,masc,plur)),\n",
       "                               Form('год',\n",
       "                                    Grams(Abbr,Fixd,NOUN,inan,loct,masc,plur))]),\n",
       "                TagToken('.', [100, 101), 'PUNCT', 'O'),\n",
       "                MorphTagToken('Люберцы',\n",
       "                              [101, 108),\n",
       "                              'RU',\n",
       "                              'O',\n",
       "                              [Form('люберцы',\n",
       "                                    Grams(GNdr,Geox,NOUN,Pltm,inan,nomn,plur)),\n",
       "                               Form('люберцы',\n",
       "                                    Grams(GNdr,Geox,NOUN,Pltm,accs,inan,plur))]),\n",
       "                TagToken(',', [108, 109), 'PUNCT', 'O'),\n",
       "                MorphTagToken('ул',\n",
       "                              [110, 112),\n",
       "                              'RU',\n",
       "                              'O',\n",
       "                              [Form('ул', Grams(UNKN))]),\n",
       "                TagToken('.', [112, 113), 'PUNCT', 'O'),\n",
       "                MorphTagToken('Инициативная',\n",
       "                              [114, 126),\n",
       "                              'RU',\n",
       "                              'I',\n",
       "                              [Form('инициативный',\n",
       "                                    Grams(ADJF,Qual,femn,nomn,sing))]),\n",
       "                TagToken(',', [126, 127), 'PUNCT', 'O'),\n",
       "                MorphTagToken('д',\n",
       "                              [128, 129),\n",
       "                              'RU',\n",
       "                              'O',\n",
       "                              [Form('далее', Grams(ADVB,Abbr))]),\n",
       "                TagToken('.', [129, 130), 'PUNCT', 'O'),\n",
       "                TagToken('5', [130, 131), 'INT', 'O')],\n",
       "               [99, 131))])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "Address(parts=[Street(name='Коммунистическая',\n",
       "                      type='улица'), Building(number='85/6',\n",
       "                        type='дом'), Room(number='10',\n",
       "                    type='офис')])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "Address(parts=[Settlement(name='Люберцы',\n",
       "                          type='город'), Street(name='Инициативная',\n",
       "                      type='улица'), Building(number='5',\n",
       "                        type='дом')])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from natasha import AddressExtractor\n",
    "\n",
    "text = '''\n",
    "353691, Ейск г, Коммунистическая ул, д.85/6, оф. 10 , («Ейск Коммунистическая_2349_С\n",
    "\n",
    "типография: г.Люберцы, ул. Инициативная, д.5\n",
    "\n",
    "601440, г. Вязники, Владимирская область, микрорайон Дечинский, д. 11.\n",
    "'''\n",
    "\n",
    "extractor = AddressExtractor()\n",
    "matches = extractor(text)\n",
    "display(matches)\n",
    "for match in matches:\n",
    "    display(match.fact)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mypy3",
   "language": "python",
   "name": "mypy3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
